package com.klm.easymq.core.adapter.message;

import lombok.Data;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

import java.util.HashMap;
import java.util.Map;

/**
 * 统一消息对象
 * 封装消息的通用属性，适配不同MQ的消息格式
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Message {
    
    /**
     * 消息主题
     */
    private String topic;
    
    /**
     * 消息标签
     */
    private String tag;
    
    /**
     * 消息键
     */
    private String key;
    
    /**
     * 消息内容
     */
    private Object body;
    
    /**
     * 消息ID
     */
    private String messageId;
    
    /**
     * 追踪ID
     */
    private String traceId;
    
    /**
     * 延迟级别
     */
    private Integer delayLevel;
    
    /**
     * 消息类型
     */
    private MessageType messageType;
    
    /**
     * 发送模式
     */
    private SendMode sendMode;
    
    /**
     * 消息属性
     */
    @Builder.Default
    private Map<String, String> properties = new HashMap<>();
    
    /**
     * 创建时间戳
     */
    @Builder.Default
    private Long createTime = System.currentTimeMillis();
    
    /**
     * 消息类型
     */
    public enum MessageType {
        /**
         * 普通消息
         */
        NORMAL,
        
        /**
         * 顺序消息
         */
        ORDERED,
        
        /**
         * 事务消息
         */
        TRANSACTION
    }
    
    /**
     * 发送模式
     */
    public enum SendMode {
        /**
         * 同步发送
         */
        SYNC,
        
        /**
         * 异步发送
         */
        ASYNC,
        
        /**
         * 单向发送
         */
        ONEWAY
    }
    
    /**
     * 添加消息属性
     * @param key 属性键
     * @param value 属性值
     * @return 当前消息对象
     */
    public Message addProperty(String key, String value) {
        this.properties.put(key, value);
        return this;
    }
    
    /**
     * 获取消息属性
     * @param key 属性键
     * @return 属性值
     */
    public String getProperty(String key) {
        return this.properties.get(key);
    }
    
    /**
     * 获取消息属性，如果不存在返回默认值
     * @param key 属性键
     * @param defaultValue 默认值
     * @return 属性值
     */
    public String getProperty(String key, String defaultValue) {
        return this.properties.getOrDefault(key, defaultValue);
    }
} 